# -------------------------------------------------------------
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
# -------------------------------------------------------------

# Autogenerated By   : src/main/python/generator/generator.py
# Autogenerated From : scripts/builtin/imputeByKNN.dml

from typing import Dict, Iterable

from systemds.operator import OperationNode, Matrix, Frame, List, MultiReturn, Scalar
from systemds.utils.consts import VALID_INPUT_TYPES


def imputeByKNN(X: Matrix,
                **kwargs: Dict[str, VALID_INPUT_TYPES]):
    """
     Imputes missing values, indicated by NaNs, using KNN-based methods
     (k-nearest neighbors by euclidean distance). In order to avoid NaNs in
     distance computation and meaningful nearest neighbor search, we initialize
     the missing values by column means. Currently, only the column with the most
     missing values is actually imputed.
    
    
    
    :param X: Matrix with missing values, which are represented as NaNs
    :param method: Method used for imputing missing values with different performance and accuracy tradeoffs:\n
        - 'dist' (default): Compute all-pairs distances and impute the missing values by closest. O(N^2 * #features)
        - 'dist_missing': Compute distances between data and records with missing values. O(N*M * #features), assuming that the number of records with MV is M<<N.
        - 'dist_sample': Compute distances between sample of data and records with missing values. O(S*M * #features) with M<<N and S<<N, but suboptimal imputation.
    :param seed: Root seed value for random/sample calls for deterministic behavior. -1 for true randomization
    :param sample_frac: Sample fraction for 'dist_sample' (value between 0 and 1)
    :return: Imputed dataset
    """

    params_dict = {'X': X}
    params_dict.update(kwargs)
    return Matrix(X.sds_context,
        'imputeByKNN',
        named_input_nodes=params_dict)
